(More) Recursive Type Aliases
typescriptでは再帰的な型定義ができなかった
interfaceを経由する回避策はあった
かつて
code:ts
type Json =
| string
| number
| boolean
| null
| JsonObject
| JsonArray;
interface JsonObject {
}
interface JsonArray extends Array<Json> {}
これが3.7でこうかける
code:ts
type Json =
| string
| number
| boolean
| null
| Json[];
以下なら循環参照ができるようになった
Instantiations of generic class and interface types (for example Array<Foo>).
Array types (for example Foo[]).
Tuple types (for example [string, Foo?]).
一般には、再帰を許すと型の定義が有限時間で終わるか分からん
めっちゃ再帰が続くとメモリ食いまくっていく
上記は、特定の場合にのみ、これを回避してもやっていけるという前提を元にやっている
また、typescriptの型まわりにおいて、特定の回避策的なものがあるが、
じゃあその回避策で無限ループしたり、メモリ食いまくったりするのかとかがよくわらかん
Haskell周辺は遅延評価とかそういうやつが関係している?